package logica;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Random;

import objetosGraficos.Nave;
import objetosGraficos.NaveEnemiga;
import objetosGraficos.NaveJugador;
import frame.FrameJuego;

public class MovimientoNaves extends Thread{

	private NaveJugador naveJugador;
	private FrameJuego juego;
	private Random aleatorio;	
	private Nivel nivelActual;
	private NaveEnemiga [] naves;

	
	public MovimientoNaves (FrameJuego juego, NaveJugador naveJugador, List<NaveEnemiga> lista) {
		this.naveJugador = naveJugador;
		this.juego = juego;
		this.naves = new NaveEnemiga[10];
		this.aleatorio = new Random();
		for (int i = 0 ; i < 10; i++)
			naves[i] = lista.get(i);
	}
	
	
	public void run (){
		Par<Integer,Integer> intervalo = nivelActual.liberarIntervalo();
		avanzarNivel (intervalo.getX(),intervalo.getY());
		while (naveJugador.getSalud() > 0){
			try {
				Thread.sleep(65);
				for (NaveEnemiga n : naves){
					if (n.getEstado()){
						n.mover();
						if (Colision.colision(this.naveJugador, n)){
							this.naveJugador.reducirSalud(100);
							juego.eliminarNaveJugador();
							juego.gameOver();
						}
						rePos (n);
					}
					
					if(todasApagadas()){
						Thread.sleep(3000);
						intervalo = nivelActual.liberarIntervalo();
						
						try{
							avanzarNivel (intervalo.getX(),intervalo.getY());
						} catch (NullPointerException ex){
							nivelActual = nivelActual.getSiguienteNivel();
							if (nivelActual == null){
								juego.win();
								break;
							}
						}
					}
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}		
			
		}
		
	}

	private void avanzarNivel(int cantNaves, int tipoMovimiento){
		switch (tipoMovimiento){
			case Nivel.MOVIMIENTO_ABAJO_PARALELO: {
				movimientoAbajoParalelo (cantNaves);
				break;
			}
			case Nivel.MOVIMIENTO_ABAJO_TRIPLE: {
				movimientoAbajoTriple(cantNaves);
				break;			
			}
			case Nivel.MOVIMIENTO_DIAGONAL: {
				movimientoDiagonal(cantNaves);
				break;
			}
			case Nivel.MOVIMIENTO_SORPRESA: {
				movimientoSorpresa(cantNaves);
				break;
			}
		}
	}

	
	private boolean todasApagadas(){
		boolean salida = false;
		for (int i = 0; (i < naves.length) && !salida; i++)
			salida = salida | naves[i].getEstado();
		return !salida;
	}
	
	private void rePos (NaveEnemiga n) {
		int x = aleatorio.nextInt(500);
		if ((n.getX() < 0 - n.getWidth()) || (n.getX() > 550 + n.getWidth()) || (n.getY() > 700+ n.getHeight())){
			n.setLocation(x, -30);
			n.setMovimiento(NaveEnemiga.ABAJO);
		}
	}
	
	private void movimientoSorpresa (int cantNaves){
		int altoNave = naves[0].getHeight();
		int anchoNave = naves[0].getWidth();
		int anchoJuego = juego.getWidth() - 6;
		int y = juego.getHeight()/2 + 100;
		for (int i = 0; i < cantNaves/2; i++){
			naves[i].setLocation(-anchoNave, y);
			naves[i].encender();
			naves[i].setMovimiento(NaveEnemiga.DERECHA);
			naves[i].modificarFactor(15);
			y += (+altoNave -20);
			
		}
		
		y = juego.getHeight()/2 + 100;
		for (int i = cantNaves/2; i < cantNaves; i++){
			naves[i].setLocation(anchoJuego, y);
			naves[i].encender();
			naves[i].setMovimiento (NaveEnemiga.IZQUIERDA);
			naves[i].modificarFactor(15);
			y += (+altoNave - 20);
		}
	}
	
	
	private void movimientoAbajoTriple (int cantNaves){
		int altoNave = naves[0].getHeight();
		int anchoNave = naves[0].getWidth();
		int anchoJuego = juego.getWidth() - 6;
		int y = -altoNave;
		for (int i = 0; i < cantNaves/3; i++){
			naves[i].setLocation(0, y);
			naves[i].encender();
			naves[i].modificarFactor(10);
			y += (-altoNave -20);
			
		}
		
		y = -altoNave;
		for (int i = cantNaves/3; i < cantNaves/3*2; i++){
			naves[i].setLocation(anchoJuego/2 - anchoNave/2 , y);
			naves[i].encender();
			naves[i].modificarFactor(10);
			y += (-altoNave - 20);
		}
		
		y = -altoNave;
		for (int i = cantNaves/3*2; i < cantNaves; i++){
			naves[i].setLocation(anchoJuego - anchoNave , y);
			naves[i].encender();
			naves[i].modificarFactor(10);
			y += (-altoNave - 20);
		}
	}
	
	private void movimientoAbajoParalelo (int cantNaves){
		int altoNave = naves[0].getHeight();
		int anchoNave = naves[0].getWidth();
		int anchoJuego = juego.getWidth() - 6;
		int y = -altoNave;
		for (int i = 0; i < cantNaves/2; i++){
			naves[i].setLocation(0, y);
			naves[i].encender();
			naves[i].modificarFactor(12);
			y += (-altoNave -20);
			
		}
		
		y = -altoNave;
		for (int i = cantNaves/2; i < cantNaves; i++){
			naves[i].setLocation(anchoJuego - anchoNave, y);
			naves[i].encender();
			naves[i].modificarFactor(12);
			y += (-altoNave - 20);
		}

	}
	
	private void movimientoDiagonal (int cantNaves){
		int altoNave = naves[0].getHeight();
		int anchoNave = naves[0].getWidth();
		int anchoJuego = juego.getWidth() - 6;
		int y = -altoNave;
		for (int i = 0; i < cantNaves/2; i++){
			naves[i].setLocation(0, y);
			naves[i].encender();
			naves[i].setMovimiento(NaveEnemiga.ABAJO_DERECHA);
			naves[i].modificarFactor(10);
			y += (-altoNave -20);
			
		}
		
		y = -altoNave;
		for (int i = cantNaves/2; i < cantNaves; i++){
			naves[i].setLocation(anchoJuego - anchoNave, y);
			naves[i].encender();
			naves[i].setMovimiento(NaveEnemiga.ABAJO_IZQUIERDA);
			naves[i].modificarFactor(10);
			y += (-altoNave - 20);
		}

	}

	public void setNivel (Nivel n){
		this.nivelActual = n;
	}
	
}
